﻿using JellystonePark.Model;


namespace JellystonePark.JellystoneWPF.ViewModel
{
    /// <summary>
    /// Beállítás ablak nézetmodell típusa.
    /// </summary>
    public class SetupViewModel : ViewModelBase
    {
        #region Fields

        private string _playerName;
        private JellystoneModel.GameDifficulty _difficulty;
        private bool _useDefaultLevels;
        private bool? _dialogResult;

        #endregion

        #region Properties

        /// <summary>
        /// Játék indítása parancs lekérdezése.
        /// </summary>
        public DelegateCommand StartGameCommand { get; private set; }

        public bool? DialogResult
        {
            get
            {
                return _dialogResult;
            }

            set
            {
                _dialogResult = value;
                OnPropertyChanged("DialogResult");
            }
        }

        /// <summary>
        /// Játékos nevének lekérdezése.
        /// </summary>
        public string PlayerName
        {
            get { return _playerName; }
            set { _playerName = value; }
        }

        public bool IsGameEasy
        {
            get { return JellystoneModel.GameDifficulty.Easy == _difficulty; }
            set { SetDifficulty(JellystoneModel.GameDifficulty.Easy); }
        }

        public bool IsGameModerate
        {
            get { return JellystoneModel.GameDifficulty.Moderate == _difficulty; }
            set { SetDifficulty(JellystoneModel.GameDifficulty.Moderate); }
        }

        public bool IsGameHard
        {
            get { return JellystoneModel.GameDifficulty.Hard == _difficulty; }
            set { SetDifficulty(JellystoneModel.GameDifficulty.Hard); }
        }

        public JellystoneModel.GameDifficulty Difficulty { get { return _difficulty; } protected set { _difficulty = value; } }

        public bool IsDefaultLevels
        {
            get { return _useDefaultLevels; }
            set { _useDefaultLevels = value; }
        }

        #endregion

        #region Constructors

        public SetupViewModel()
        {
            SetDifficulty(JellystoneModel.GameDifficulty.Moderate);
            _useDefaultLevels = true;
            OnPropertyChanged("IsDefaultLevels");
            StartGameCommand = new DelegateCommand(x => { OnStartGame(); });
        }

        #endregion

        #region Command Methods

        /// <summary>
        /// Játék indítás parancshoz társított metódus.
        /// </summary>
        private void OnStartGame()
        {
            if (null != _playerName && 0 != _playerName.Length)
                DialogResult = true;
            else
                DialogResult = false;
        }

        #endregion

        #region Private methods

        /// <summary>
        /// Parancsok kiadása nehézségi szint változtatás után.
        /// </summary>
        private void UpdateDifficultyProperties()
        {
            OnPropertyChanged("IsGameEasy");
            OnPropertyChanged("IsGameModerate");
            OnPropertyChanged("IsGameHard");
        }
        
        /// <summary>
        /// Nehézségi szint beállítása és felület-frissítés kiváltása.
        /// </summary>
        /// <param name="gameDifficulty"></param>
        private void SetDifficulty(JellystoneModel.GameDifficulty gameDifficulty)
        {
            _difficulty = gameDifficulty;
            UpdateDifficultyProperties();
        }

        #endregion
    }
}
